package fr.gestproj.bean.securite.spring;

import com.ocpsoft.pretty.faces.util.StringUtils;
import fr.gestproj.facade.UtilisateurFacade;
import fr.gestproj.model.Utilisateur;
import fr.gestproj.utils.UtilsAuthentication;
import fr.gestproj.utils.UtilsMetier;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.RememberMeAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

/**
 *
 * @author Parrot
 */
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    private SessionRegistry sessionRegistry;
    private String servletPath;
    private String targetUrl;

    public CustomAuthenticationSuccessHandler() {
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest pHttpServletRequest, HttpServletResponse pHttpServletResponse, Authentication pAuthentication) throws IOException, ServletException {
        Utilisateur utilisateur = ((Utilisateur) ((AbstractAuthenticationToken) pAuthentication).getPrincipal());
        UtilsAuthentication.updateUserDetails(utilisateur.getId());

        // Si l'utilisateur se connecte en tant que "remember me"
        if (pAuthentication instanceof RememberMeAuthenticationToken) {
            List<SessionInformation> listeSession = sessionRegistry.getAllSessions(utilisateur, false);
            if (!listeSession.isEmpty()) {
                for (SessionInformation session : listeSession) {
                    session.expireNow();
                }
            }
            sessionRegistry.registerNewSession(pHttpServletRequest.getSession().getId(), utilisateur);
        }

        if (StringUtils.isNotBlank(utilisateur.getTokenModificationPassword())) {
            UtilsMetier.getBean(UtilisateurFacade.class).reinitialiserToken(utilisateur);
        }
        UtilsMetier.getBean(UtilisateurFacade.class).modifierDateDerniereConnexion(utilisateur);
        UtilsMetier.getBean(UtilisateurFacade.class).modificationNombreEchecConnexion(utilisateur, 0);

        if (pHttpServletRequest.getServletPath().equals(servletPath)) {
            pHttpServletResponse.sendRedirect(pHttpServletRequest.getRequestURL().toString());
        } else {
            pHttpServletResponse.sendRedirect(pHttpServletRequest.getContextPath() + targetUrl);
        }
    }

    public SessionRegistry getSessionRegistry() {
        return this.sessionRegistry;
    }

    public void setSessionRegistry(SessionRegistry pSessionRegistry) {
        this.sessionRegistry = pSessionRegistry;
    }

    public String getServletPath() {
        return servletPath;
    }

    public void setServletPath(String servletPath) {
        this.servletPath = servletPath;
    }

    public String getTargetUrl() {
        return targetUrl;
    }

    public void setTargetUrl(String targetUrl) {
        this.targetUrl = targetUrl;
    }

}
